2023 年 10 月 18 日,在 Ethereum 上发生的一起攻击事件,损失了大约 528 ETH。
HopeLend is a decentralized non-custodial lending protocol with multiple liquidity pools. (Like Aave)
In simple terms, users can deposit underlying assets to provide liquidity. When this liquidity generates income through lending, a portion of the earnings is distributed to the liquidity providers.
利用 Hopelend 的 hEthWBTC 交易池中的流动性不足,通过人为手段来抬高 hEthWBTC 的价值。随后,黑客利用借贷功能从池中取走所有代币(HOPE、stHOPE、wstETH、WETH、USDT、USDC)。
利用 Aave 中的闪电贷功能,通过函数 rayDiv 的精度损失漏洞,将借入的 2000 个 WBTC 转移到 Hopelend 中,从而清空了黑客在攻击早期投入的所有 WBTC。(与 230415 Hundred Finance 的问题比较类似,都是 hTokens 和 underlying asserts 之间的换算公式存在精度误差)
问题合约地址:https://etherscan.io/address/0x1c2220437b068a8c124ac1d158f7f786fbea701e
LiquidityIndex
首先,Attacker 利用 Aave 闪贷 2300 WBTC,随后向 HopeLend 中存入 2000 WBTC,并获得交易池为其铸造的 2000 hEthWBTC。
后攻击者又向 HopeLend 闪贷了 2,000 WBTC,并通过 executeOperation
函数,在接收 2,000 WBTC 后,又将这 2,000 WBTC 存入 HopeLend,随即取出 1,999.99999999 WBTC。最终,HopeLend 池子中只剩下 0.00000001 WBTC 作为 Underlying Token。
通过反复执行 Flashloan 操作,攻击者可以逐渐将 hEthWBTC 的价值提高( #🚧/3 主要原因是其池子初始为空,通过利率计算公式可以达到「指数」提升的效果,但是具体的数学过程仍有待研究)
最终,0.00000001 hEthWTBC 可以兑换 75.60000001 WBTC。
此时,攻击者将池子中的所有代币全部借出:
利用上文提到的 舍入漏洞,Attacker 在取出 113.4 WBTC 时,只需要消耗 0.00000001 的 hEthWBTC。
同时,攻击者只需要存入 75.6 WBTC 即可获得 0.00000001 的 hEthWBTC。
重复操作,就可以将池子中的 WBTC 全部兑换出来。